package com.ruoyi.system.service.impl;

import com.ruoyi.common.core.constant.MqConstants;
import com.ruoyi.heima.news.client.NewsClient;
import com.ruoyi.heima.news.domain.News;
import com.ruoyi.heima.news.enums.NewsStatus;
import com.ruoyi.system.domain.SysNotice;
import com.ruoyi.system.mapper.SysNoticeMapper;
import com.ruoyi.system.service.ISysNoticeService;
import lombok.RequiredArgsConstructor;
import org.springframework.amqp.rabbit.core.RabbitTemplate;
import org.springframework.stereotype.Service;
import org.springframework.transaction.annotation.Transactional;

import java.util.Date;
import java.util.List;

/**
 * 公告 服务层实现
 *
 * @author ruoyi
 */
@Service
@RequiredArgsConstructor
public class SysNoticeServiceImpl implements ISysNoticeService {

    private final SysNoticeMapper noticeMapper;

    private final NewsClient newsClient;

    private final RabbitTemplate rabbitTemplate;

    /**
     * 查询公告信息
     *
     * @param noticeId 公告ID
     * @return 公告信息
     */
    @Override
    public SysNotice selectNoticeById(Long noticeId) {
        return noticeMapper.selectNoticeById(noticeId);
    }

    /**
     * 查询公告列表
     *
     * @param notice 公告信息
     * @return 公告集合
     */
    @Override
    public List<SysNotice> selectNoticeList(SysNotice notice) {
        return noticeMapper.selectNoticeList(notice);
    }

    /**
     * 新增公告
     *
     * @param notice 公告信息
     * @return 结果
     */
    @Override
    public int insertNotice(SysNotice notice) {
        int count = noticeMapper.insertNotice(notice);

        // 如果新增通知公告成功，    且通知状态为0-正常，则发送新闻
        if (count > 0) {
            News news = ConvertToNews(notice);
            newsClient.addNewsFromNotice(news);
        }

        return count;
    }

    /**
     * 修改公告
     *
     * @param notice 公告信息
     * @return 结果
     */
    @Override
    @Transactional
    public int updateNotice(SysNotice notice) {
        int count = noticeMapper.updateNotice(notice);

        // 如果修改通知公告成功 则对新闻管理
        if (count > 0) {
            News news = ConvertToNews(notice);
            News dbNews = newsClient.selectNewsByNoticeId(notice.getNoticeId());
            if (dbNews.getNewsId() == null){
                throw new RuntimeException("通知公告不存在");
            }
            // 修改新闻
            news.setNewsId(dbNews.getNewsId());
            newsClient.updateNewsByNoticeId(news);

            // 根据公告状态发送消息
            if ("3".equals(news.getStatus().getStatus().toString())) {
                rabbitTemplate.convertAndSend(MqConstants.NEWS_EXCHANGE, MqConstants.NEWS_DEL_ROUTING_KEY, news.getNewsId().toString());
            } else if("2".equals(news.getStatus().getStatus().toString())) {
                // 反之发送修改消息
                rabbitTemplate.convertAndSend(MqConstants.NEWS_EXCHANGE, MqConstants.NEWS_UDP_ROUTING_KEY, news);
            }
        }
        return count;
    }

    /**
     * 删除公告对象
     *
     * @param noticeId 公告ID
     * @return 结果
     */
    @Override
    public int deleteNoticeById(Long noticeId) {
        int count = noticeMapper.deleteNoticeById(noticeId);
        // 如果通知公告删除成功，则删除新闻
        if (count > 0) {
            Long[] noticeIds = new Long[]{noticeId};
            // 删除新闻
            newsClient.deleteNewsFromNotice(noticeIds);
        }
        return count;
    }

    /**
     * 批量删除公告信息
     *
     * @param noticeIds 需要删除的公告ID
     * @return 结果
     */
    @Override
    public int deleteNoticeByIds(Long[] noticeIds) {
        int count = noticeMapper.deleteNoticeByIds(noticeIds);

        // 如果通知公告删除成功，则删除新闻
        if (count > 0) {
            for (Long noticeId : noticeIds) {
                News dbNews = newsClient.selectNewsByNoticeId(noticeId);
                rabbitTemplate.convertAndSend(MqConstants.NEWS_EXCHANGE, MqConstants.NEWS_DEL_ROUTING_KEY, dbNews.getNewsId().toString());
            }
            // 批量删除新闻
            newsClient.deleteNewsFromNotice(noticeIds);
        }

        return count;
    }

    /**
     * 通知公告对象转换为新闻对象
     * @param notice
     * @return
     */
    private News ConvertToNews(SysNotice notice) {
        News news = new News();
        news.setTitle(notice.getNoticeTitle());
        news.setNoticeId(notice.getNoticeId());
        news.setContent(notice.getNoticeContent());
        // 通知类型  1-通知，2-公告
        news.setSource("通知公告");
        // 通知公告的新闻类型为6-其他
        news.setTypeId(6);
        news.setCreateBy(notice.getCreateBy());
        news.setCreateTime(new Date());
        news.setUpdateBy(notice.getUpdateBy());
        news.setUpdateTime(new Date());
        news.setRemark(notice.getRemark());
        if (notice.getStatus().equals("1")) {
            // 如果通知公告为关闭，则设置新闻状态为delete
            news.setStatus(NewsStatus.DELETED);
        } else {
            news.setStatus(NewsStatus.NORMAL);
        }
        return news;
    }
}
